home *** CD-ROM | disk | FTP | other *** search
/ Space & Astronomy / Space and Astronomy (October 1993).iso / mac / VIEWERS / X11 / XLOADIMG.TAR / zoom.c < prev   
C/C++ Source or Header  |  1991-05-20  |  4KB  |  180 lines

  1. /* zoom.c:
  2.  *
  3.  * zoom an image
  4.  *
  5.  * jim frost 10.11.89
  6.  *
  7.  * Copyright 1989 Jim Frost.  See included file "copyright.h" for complete
  8.  * copyright information.
  9.  */
  10.  
  11. #include "copyright.h"
  12. #include "image.h"
  13.  
  14. static unsigned int *buildIndex(width, zoom, rwidth)
  15.      unsigned int  width;
  16.      unsigned int  zoom;
  17.      unsigned int *rwidth;
  18. { float         fzoom;
  19.   unsigned int *index;
  20.   unsigned int  a;
  21.  
  22.   if (!zoom) {
  23.     fzoom= 100.0;
  24.     *rwidth= width;
  25.   }
  26.   else {
  27.     fzoom= (float)zoom / 100.0;
  28.     *rwidth= fzoom * width;
  29.   }
  30.   index= (unsigned int *)lmalloc(sizeof(unsigned int) * *rwidth);
  31.   for (a= 0; a < *rwidth; a++)
  32.     if (zoom)
  33.       *(index + a)= (float)a / fzoom;
  34.     else
  35.       *(index + a)= a;
  36.   return(index);
  37. }
  38.  
  39. Image *zoom(oimage, xzoom, yzoom, verbose)
  40.      Image        *oimage;
  41.      unsigned int  xzoom, yzoom;
  42. { char          buf[BUFSIZ];
  43.   Image        *image;
  44.   unsigned int *xindex, *yindex;
  45.   unsigned int  xwidth, ywidth;
  46.   unsigned int  x, y, xsrc, ysrc;
  47.   unsigned int  pixlen;
  48.   unsigned int  srclinelen;
  49.   unsigned int  destlinelen;
  50.   byte         *srcline, *srcptr;
  51.   byte         *destline, *destptr;
  52.   byte          srcmask, destmask, bit;
  53.   Pixel         value;
  54.  
  55.   goodImage(oimage, "zoom");
  56.  
  57.   if (!xzoom && !yzoom) /* stupid user */
  58.     return(NULL);
  59.  
  60.   if (!xzoom) {
  61.     if (verbose)
  62.       printf("  Zooming image Y axis by %d%%...", yzoom);
  63.       sprintf(buf, "%s (Y zoom %d%%)", oimage->title, yzoom);
  64.   }
  65.   else if (!yzoom) {
  66.     if (verbose)
  67.       printf("  Zooming image X axis by %d%%...", xzoom);
  68.     sprintf(buf, "%s (X zoom %d%%)", oimage->title, xzoom);
  69.   }
  70.   else if (xzoom == yzoom) {
  71.     if (verbose)
  72.       printf("  Zooming image by %d%%...", xzoom);
  73.     sprintf(buf, "%s (%d%% zoom)", oimage->title, xzoom);
  74.   }
  75.   else {
  76.     if (verbose)
  77.       printf("  Zooming image X axis by %d%% and Y axis by %d%%...",
  78.          xzoom, yzoom);
  79.     sprintf(buf, "%s (X zoom %d%% Y zoom %d%%)", oimage->title,
  80.         xzoom, yzoom);
  81.   }
  82.   if (verbose)
  83.     fflush(stdout);
  84.  
  85.   xindex= buildIndex(oimage->width, xzoom, &xwidth);
  86.   yindex= buildIndex(oimage->height, yzoom, &ywidth);
  87.  
  88.   switch (oimage->type) {
  89.   case IBITMAP:
  90.     image= newBitImage(xwidth, ywidth);
  91.     for (x= 0; x < oimage->rgb.used; x++) {
  92.       *(image->rgb.red + x)= *(oimage->rgb.red + x);
  93.       *(image->rgb.green + x)= *(oimage->rgb.green + x);
  94.       *(image->rgb.blue + x)= *(oimage->rgb.blue + x);
  95.     }
  96.     image->rgb.used= oimage->rgb.used;
  97.     destline= image->data;
  98.     destlinelen= (xwidth / 8) + (xwidth % 8 ? 1 : 0);
  99.     srcline= oimage->data;
  100.     srclinelen= (oimage->width / 8) + (oimage->width % 8 ? 1 : 0);
  101.     for (y= 0, ysrc= *(yindex + y); y < ywidth; y++) {
  102.       while (ysrc != *(yindex + y)) {
  103.     ysrc++;
  104.     srcline += srclinelen;
  105.       }
  106.       srcptr= srcline;
  107.       destptr= destline;
  108.       srcmask= 0x80;
  109.       destmask= 0x80;
  110.       bit= srcmask & *srcptr;
  111.       for (x= 0, xsrc= *(xindex + x); x < xwidth; x++) {
  112.     if (xsrc != *(xindex + x)) {
  113.       do {
  114.         xsrc++;
  115.         if (!(srcmask >>= 1)) {
  116.           srcmask= 0x80;
  117.           srcptr++;
  118.         }
  119.       } while (xsrc != *(xindex + x));
  120.       bit= srcmask & *srcptr;
  121.     }
  122.     if (bit)
  123.       *destptr |= destmask;
  124.     if (!(destmask >>= 1)) {
  125.       destmask= 0x80;
  126.       destptr++;
  127.     }
  128.       }
  129.       destline += destlinelen;
  130.     }
  131.     break;
  132.  
  133.   case IRGB:
  134.     image= newRGBImage(xwidth, ywidth, oimage->depth);
  135.     for (x= 0; x < oimage->rgb.used; x++) {
  136.       *(image->rgb.red + x)= *(oimage->rgb.red + x);
  137.       *(image->rgb.green + x)= *(oimage->rgb.green + x);
  138.       *(image->rgb.blue + x)= *(oimage->rgb.blue + x);
  139.     }
  140.     image->rgb.used= oimage->rgb.used;
  141.     /* FALLTHRU */
  142.  
  143.   case ITRUE:
  144.     if (!RGBP(image))
  145.       image= newTrueImage(xwidth, ywidth);
  146.     pixlen= oimage->pixlen;
  147.     destptr= image->data;
  148.     srcline= oimage->data;
  149.     srclinelen= oimage->width * pixlen;
  150.     for (y= 0, ysrc= *(yindex + y); y < ywidth; y++) {
  151.       while (ysrc != *(yindex + y)) {
  152.     ysrc++;
  153.     srcline += srclinelen;
  154.       }
  155.  
  156.       srcptr= srcline;
  157.       value= memToVal(srcptr, pixlen);
  158.       for (x= 0, xsrc= *(xindex + x); x < xwidth; x++) {
  159.     if (xsrc != *(xindex + x)) {
  160.       do {
  161.         xsrc++;
  162.         srcptr += image->pixlen;
  163.       } while (xsrc != *(xindex + x));
  164.       value= memToVal(srcptr, pixlen);
  165.     }
  166.     valToMem(value, destptr, pixlen);
  167.     destptr += pixlen;
  168.       }
  169.     }
  170.     break;
  171.   }
  172.  
  173.   image->title= dupString(buf);
  174.   lfree((byte *)xindex);
  175.   lfree((byte *)yindex);
  176.   if (verbose)
  177.     printf("done\n");
  178.   return(image);
  179. }
  180.